home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / cdrom.s < prev    next >
Text File  |  1999-12-19  |  35KB  |  1,426 lines

  1.     .include    iocscall.mac
  2.     .include    scsiconst.equ
  3.     .include    CDC.MAC
  4.     .include    global.mac
  5.  
  6. ;----------------------------------------------------------------
  7. ;SCSI-IDの初期化
  8.     .text
  9.     .align    4,$2048
  10. init_scsiid::
  11.     move.l    param_scsiid,d0
  12.     bpl    10f
  13.     tst.b    cdrom_env_work
  14.     beq    80f
  15.     bra    81f
  16.  
  17. 10:    move.l    d0,scsiid
  18. 98:    moveq.l    #0,d0
  19. 99:    rts
  20.  
  21. 80:    move.w    #EXIT_SCSIID_MISSING,exit_code
  22.     lea.l    (m_id_not_specified,pc),a0
  23.     bra    89f
  24. 81:    move.w    #EXIT_ILLEGAL_ENV_CDROM,exit_code
  25.     lea.l    (m_illegal_cdrom_env,pc),a0
  26. 89:    bsr    print_banner
  27.     bsr    eaprintcrlf
  28. 90:    moveq.l    #-1,d0
  29.     bra    99b
  30.  
  31. m_id_not_specified:    .dc.b    'SCSI-ID が指定されていません',0
  32. m_illegal_cdrom_env:    .dc.b    '環境変数 CDROM の内容が異常です',0
  33.  
  34. ;----------------------------------------------------------------
  35. ;CD-ROMドライブの準備
  36. ;    scsiidを設定してからコールすること
  37. ;>d0.l:0=正常終了,-1=エラー
  38. ;>n-flag:mi=エラー
  39.     .text
  40.     .align    4,$2048
  41. init_cdrom::
  42.     movem.l    d1-d7/a0-a6,-(sp)
  43.  
  44.     move.l    scsiid,d0
  45.     cmp.l    initialized_scsiid,d0
  46.     beq    98f
  47.  
  48.     move.l    initialized_scsiid,d0
  49.     bmi    @f
  50.     move.l    scsiid,-(sp)
  51.     move.l    d0,scsiid
  52.     bsr    tini_cdrom
  53.     move.l    (sp)+,scsiid
  54. @@:
  55.  
  56. ;指定されたSCSI-IDの装置が使えるか調べる
  57.     lea.l    inquiry_buffer,a4
  58.     moveq.l    #INQUIRY_RETRY_COUNT-1,d7
  59. 1:    movea.l    a4,a1
  60.     moveq.l    #5,d3            ;拡張データサイズを得る
  61.     move.l    scsiid,d4
  62.     SCSI    _S_INQUIRY
  63.     move.l    d0,d1
  64.     beq    2f
  65.     moveq.l    #50,d0            ;0.5秒待つ
  66.     bsr    wait_sec
  67.     dbra    d7,1b
  68.     move.l    d1,d0
  69.     bmi    80f            ;指定されたSCSI-IDの装置は動作不可能
  70.     bne    81f            ;inquiryを取得できない
  71. 2:
  72.  
  73. ;inqiryを取得する
  74.     movea.l    a4,a1
  75.     moveq.l    #0,d3
  76.     move.b    (SCSINQ_ADDLEN,a4),d3    ;拡張データサイズ
  77.     move.l    scsiid,d4
  78.     SCSI    _S_INQUIRY
  79.     tst.l    d0
  80.     bne    81f            ;inquiryを取得できない
  81.  
  82. ;指定されたSCSI-IDの装置はCD-ROMか?
  83.     cmpi.b    #SCSI_TYPE_CDROM,(SCSINQ_TYPE,a4)
  84.     bne    82f            ;指定されたSCSI-IDの装置はCD-ROMではない
  85.  
  86. ;CD-ROMドライブの種類を調べる
  87.     tst.b    cdrom_type
  88.     bpl    2f            ;コマンドラインで指定済みなので調べない
  89.  
  90. ;以下はTOSHIBAコマンドが使えるドライブ
  91.     moveq.l    #TOSHIBA,d1
  92.     sf.b    speed_controlable_flag
  93.  
  94.     lea.l    (toshiba_inq0,pc),a1
  95.     lea.l    (SCSINQ_ADDBUF+3,a4),a0
  96.     moveq.l    #8,d0
  97.     bsr    strncmp
  98.     beq    1f
  99.  
  100. ;以下はSONYコマンドが使えるドライブ
  101.     moveq.l    #SONY,d1
  102.  
  103. ;以下は転送速度を設定できるドライブ
  104.     st.b    speed_controlable_flag
  105.  
  106.     lea.l    (sony_inq1,pc),a1
  107.     lea.l    (SCSINQ_ADDBUF+3,a4),a0
  108.     moveq.l    #22,d0
  109.     bsr    strncmp
  110.     beq    1f
  111.  
  112.     lea.l    (sony_inq2,pc),a1
  113.     lea.l    (SCSINQ_ADDBUF+3,a4),a0
  114.     moveq.l    #22,d0
  115.     bsr    strncmp
  116.     beq    1f
  117.  
  118. ;以下は転送速度を設定できないドライブ
  119.     sf.b    speed_controlable_flag
  120.  
  121.     lea.l    (sony_inq3,pc),a1
  122.     lea.l    (SCSINQ_ADDBUF+3,a4),a0
  123.     moveq.l    #13,d0
  124.     bsr    strncmp
  125.     beq    1f
  126.  
  127.     lea.l    (sony_inq4,pc),a1
  128.     lea.l    (SCSINQ_ADDBUF+3,a4),a0
  129.     moveq.l    #15,d0
  130.     bsr    strncmp
  131.     beq    1f
  132.  
  133.     lea.l    (sony_inq5,pc),a1
  134.     lea.l    (SCSINQ_ADDBUF+3,a4),a0
  135.     moveq.l    #22,d0
  136.     bsr    strncmp
  137.     beq    1f
  138.  
  139.     lea.l    (sony_inq6,pc),a1
  140.     lea.l    (SCSINQ_ADDBUF+3,a4),a0
  141.     moveq.l    #22,d0
  142.     bsr    strncmp
  143.     beq    1f
  144.  
  145.     lea.l    (sony_inq7,pc),a1
  146.     lea.l    (SCSINQ_ADDBUF+3,a4),a0
  147.     moveq.l    #16,d0
  148.     bsr    strncmp
  149.     beq    1f
  150.  
  151.     lea.l    (sony_inq8,pc),a1
  152.     lea.l    (SCSINQ_ADDBUF+3,a4),a0
  153.     moveq.l    #22,d0
  154.     bsr    strncmp
  155.     beq    1f
  156.  
  157. ;ドライブの種類が不明
  158.     bsr    print_scsi_error_message_header
  159.     lea.l    (m_unknown_drive,pc),a0
  160.     bsr    eprintcrlf
  161.     bsr    display_inquiry
  162.  
  163. 1:    move.b    d1,cdrom_type
  164. 2:
  165.  
  166. ;メディアが準備できているか調べる
  167.     moveq.l    #TESTUNIT_RETRY_COUNT-1,d7
  168. 1:    move.l    scsiid,d4
  169.     SCSI    _S_TESTUNIT
  170.     move.l    d0,d1
  171.     beq    2f
  172.     moveq.l    #50,d0            ;0.5秒待つ
  173.     bsr    wait_sec
  174.     dbra    d7,1b
  175.     move.l    d1,d0
  176. ;    bmi    80f            ;指定されたSCSI-IDの装置は動作不可能
  177.     bne    86f            ;メディアが挿入されていない
  178. 2:
  179.  
  180. ;トラック情報を取得する
  181.     bsr    get_track_info
  182.     bmi    85f
  183.  
  184. ;CD名を表示する
  185.     lea.l    cd_name,a0
  186.     tst.b    (a0)
  187.     beq    @f
  188.     bsr    silent_eprintcrlf
  189. @@:
  190.  
  191. ;ブロックサイズとリードエラーリカバリパラメータを保存する
  192.     bsr    save_blocksize_readrecovery    ;エラー無視
  193.  
  194. ;転送速度を保存する
  195.     bsr    save_cdromspeed        ;エラー無視
  196.  
  197. ;転送速度を変更する
  198.     bsr    change_cdromspeed    ;エラー無視
  199.  
  200.     move.l    scsiid,initialized_scsiid
  201.  
  202. 98:    moveq.l    #0,d0
  203. 99:    movem.l    (sp)+,d1-d7/a0-a6
  204.     rts
  205.  
  206. 80:    bsr    print_scsi_error_message_header
  207.     move.w    #EXIT_SCSI_ID_ERROR,exit_code
  208.     lea.l    (m_scsi_id_error,pc),a0
  209.     bra    89f
  210. 81:    bsr    print_scsi_error_message_header
  211.     move.w    #EXIT_INQUIRY_ERROR,exit_code
  212.     lea.l    (m_inquiry_error,pc),a0
  213.     bra    89f
  214. 82:    bsr    print_scsi_error_message_header
  215.     move.w    #EXIT_NOT_CDROM,exit_code
  216.     lea.l    (m_not_cdrom,pc),a0
  217.     bsr    eprintcrlf
  218.     bsr    display_inquiry
  219.     bra    90f
  220. 85:    bsr    print_scsi_error_message_header
  221.     move.w    #EXIT_MEDIA_INF_ERROR,exit_code
  222.     lea.l    (m_media_inf_error,pc),a0
  223.     bsr    eprintcrlf
  224.     bsr    display_inquiry
  225.     bra    90f
  226. 86:    bsr    print_scsi_error_message_header
  227.     move.w    #EXIT_MEDIA_NOT_READY,exit_code
  228.     lea.l    (m_media_not_ready,pc),a0
  229. 89:    bsr    eprintcrlf
  230. 90:    moveq.l    #-1,d0
  231.     bra    99b
  232.  
  233. ;以下はTOSHIBAコマンドが使えるドライブ
  234. toshiba_inq0:    .dc.b    'TOSHIBA '
  235. ;以下はSONYコマンドが使えるドライブ
  236. sony_inq0:    .dc.b    'SONY '
  237. ;以下は転送速度を設定できるドライブ
  238. sony_inq1:    .dc.b    'SONY    CD-ROM CDU-561'
  239. sony_inq2:    .dc.b    'SONY    CD-ROM CDU-55S'
  240. ;以下は転送速度を設定できないドライブ
  241. sony_inq3:    .dc.b    'NRC     MBR-7'
  242. sony_inq4:    .dc.b    'MATSHITAPD-1 LF'
  243. sony_inq5:    .dc.b    'PIONEER CD-ROM DR-124X'
  244. sony_inq6:    .dc.b    'PIONEER CD-ROM DR-U06S'
  245. sony_inq7:    .dc.b    'NAKAMICHMJ-5.16S'
  246. sony_inq8:    .dc.b    'TEAC    CD-ROM CD-516S'
  247.  
  248. m_scsi_id_error:    .dc.b    ' の装置にアクセスできません',0
  249. m_inquiry_error:    .dc.b    ' の装置の inquiry の取得に失敗しました',0
  250. m_not_cdrom:        .dc.b    ' の装置は CD-ROM ドライブではないようです',0
  251. m_unknown_drive:    .dc.b    ' の CD-ROM ドライブには未対応です.SONY コマンドを試みます',0
  252. m_media_inf_error:    .dc.b    ' の装置の CD のトラック情報の取得に失敗しました',0
  253. m_media_not_ready:    .dc.b    ' の CD-ROM ドライブはメディアの準備ができていません',0
  254.     .even
  255.  
  256.     .data
  257.     .align    4
  258. initialized_scsiid::    .dc.l    -2    ;init_cdrom済みのscsiid
  259.  
  260. cdrom_type::        .dc.b    -1    ;CD-ROMの種類(-1=不明,0=SONY,1=TOSHIBA)
  261. speed_controlable_flag::    .dc.b    0    ;-1=CDU-561/CDU-55S(転送速度の指定ができる)
  262.  
  263.     .bss
  264.     .even
  265. inquiry_buffer:        .ds.b    SCSINQ_SIZE
  266.  
  267. ;----------------------------------------------------------------
  268. ;CD-ROMドライブの後始末
  269. ;    scsiidを設定してからコールすること
  270.     .text
  271.     .align    4,$2048
  272. tini_cdrom::
  273.     tst.l    initialized_scsiid
  274.     bmi    98f
  275.     bsr    restore_cdromspeed
  276.     bsr    restore_readrecovery
  277.     bsr    restore_blocksize
  278. 98:    moveq.l    #0,d0            ;エラー無視
  279.     rts
  280.  
  281. ;----------------------------------------------------------------
  282. ;エラーメッセージの先頭部分としてSCSI-IDを表示する
  283.     .text
  284.     .align    4,$2048
  285. print_scsi_error_message_header::
  286.     movem.l    d0/a0,-(sp)
  287.     bsr    eaonly
  288.     lea.l    (m_scsi_error_header,pc),a0
  289.     bsr    eprint
  290.     moveq.l    #0,d0
  291.     move.w    scsiid+2,d0
  292.     bsr    utos_eprint
  293.     tst.w    scsiid
  294.     beq    @f
  295.     lea.l    (m_scsi_error_header_1,pc),a0
  296.     bsr    eprint
  297.     moveq.l    #0,d0
  298.     move.w    scsiid,d0
  299.     bsr    utos_eprint
  300.     lea.l    (m_scsi_error_header_2,pc),a0
  301.     bsr    eprint
  302. @@:    movem.l    (sp)+,d0/a0
  303.     rts
  304.  
  305. m_scsi_error_header:    .dc.b    'SCSI-ID=',0
  306. m_scsi_error_header_1:    .dc.b    '(LUN=',0
  307. m_scsi_error_header_2:    .dc.b    ')',0
  308.  
  309. ;----------------------------------------------------------------
  310. ;CD-ROMドライブのブロックサイズとリードエラーリカバリパラメータを保存する
  311. ;>d0.l:-1=エラー
  312. ;>n-flag:mi=エラー
  313.     .text
  314.     .align    4,$2048
  315. save_blocksize_readrecovery::
  316.     movem.l    d1-d7/a0-a6,-(sp)
  317.     tst.b    blocksize_readrecovery_saved
  318.     bne    98f            ;保存済み
  319.     moveq.l    #$01,d2            ;ページコード($01=リードエラーリカバリパラメータ)
  320.     moveq.l    #20,d3            ;アロケーション長
  321.     move.l    scsiid,d4
  322.     lea.l    blocksize_readrecovery_buffer,a1
  323.     SCSI    _S_MODESENSE
  324.     move.l    d0,d1
  325.     bsr    scsistssns
  326.     bne    90f            ;リードエラーリカバリパラメータページが読めない
  327.     lea.l    blocksize_readrecovery_buffer,a1
  328.     cmpi.b    #$08,(3,a1)
  329.     bne    90f            ;ブロックデスクリプタがない
  330.                     ;(_S_MODESENSEの仕様が違う)
  331.     cmpi.b    #$01,(12,a1)
  332.     bne    90f            ;ページコードが違う
  333.     cmpi.b    #$06,(13,a1)
  334.     bne    90f            ;リードエラーリカバリパラメータページの長さが違う
  335.     lea.l    current_blockdescriptor,a0    ;ブロックデスクリプタを保存する
  336.     move.l    (4,a1),(a0)+
  337.     move.l    (8,a1),(a0)+
  338.     st.b    blocksize_readrecovery_saved
  339. 98:    moveq.l    #0,d0
  340. 99:    movem.l    (sp)+,d1-d7/a0-a6
  341.     rts
  342.  
  343. 90:    sf.b    blocksize_readrecovery_saved
  344.     tst.l    d0            ;1=エラー(リトライ可),-1=エラー(リトライ不可)
  345.     smi.b    d0
  346.     subq.b    #1,d0            ;-1=エラー(リトライ可),-2=エラー(リトライ不可)
  347.     move.b    d0,scsicmd_error_call
  348.     bsr    print_scsicmd_error
  349.     bsr    print_scsi_error_message_header
  350.     lea.l    (m_blocksize_readrecovery_save_failed,pc),a0
  351.     bsr    eprintcrlf
  352.     bsr    display_inquiry
  353.     moveq.l    #-1,d0
  354.     bra    99b
  355.  
  356. m_blocksize_readrecovery_save_failed:
  357.     .dc.b    ' のリードエラーリカバリパラメータの保存に失敗しました',0
  358.  
  359.     .data
  360. blocksize_readrecovery_saved:
  361.     .dc.b    0    ;-1=ブロックサイズとリードエラーリカバリパラメータが保存された
  362.             ;(保存できたときだけ復元できる)
  363.  
  364.     .data
  365.     .even
  366. ;現在のブロックデスクリプタ
  367. current_blockdescriptor:
  368.     .dc.b    $00        ;デンシティコード
  369.     .dc.b    $00,$00,$00    ;ブロック数
  370.     .dc.b    $00        ;Reserved
  371.     .dc.b    $00,$08,$00    ;ブロック長
  372.  
  373.     .bss
  374.     .even
  375. blocksize_readrecovery_buffer:
  376. ;モードパラメータヘッダ
  377. ;+0
  378.     .ds.b    1    ;$00 モードパラメータ長(Sense時のみ)
  379.     .ds.b    1    ;$00 メディアタイプ
  380.     .ds.b    1    ;$00 デバイス固有パラメータ
  381.     .ds.b    1    ;$08 ブロックデスクリプタ長
  382. ;ブロックデスクリプタ
  383. ;+4
  384.     .ds.b    1    ;$00 デンシティコード
  385.     .ds.b    3    ;$00,$00,$00 ブロック数
  386.     .ds.b    1    ;$00 Reserved
  387.     .ds.b    3    ;$00,$08,$00 ブロック長
  388. ;モードパラメータページ
  389. ;+12
  390.     .ds.b    1    ;$01 ページコード($01=リードエラーリカバリパラメータ)
  391.     .ds.b    1    ;$06 ページ長
  392.     .ds.b    1    ;$11 リードエラーリカバリパラメータ
  393.             ;    ($11=エラー無視,訂正はCIRCのみ)
  394.     .ds.b    1    ;$00 リードリトライ回数
  395.     .ds.b    4    ;$00,$00,$00,$00 Reserved
  396. ;+20
  397.     .ds.b    12    ;予備
  398.  
  399. ;----------------------------------------------------------------
  400. ;CD-ROMドライブのブロックサイズを変更する
  401. ;<a0.l:ブロックデスクリプタ
  402. ;    $0000    $00 Reserved
  403. ;    $0001    $00,$08,$00 ブロック長
  404. ;    $0004    $00 デンシティコード
  405. ;    $0005    $00,$00,$00 ブロック数
  406. ;    (8バイト)
  407.     .text
  408.     .align    4,$2048
  409. change_blocksize::
  410.     movem.l    d1-d7/a0-a6,-(sp)
  411.     tst.b    blocksize_readrecovery_saved
  412.     beq    91f            ;保存されていないので変更できない
  413.     move.l    (a0)+,d6        ;$00 デンシティコード
  414.                     ;$00,$00,$00 ブロック数
  415.     move.l    (a0)+,d7        ;$00 Reserved
  416.                     ;$00,$08,$00 ブロック長
  417.     lea.l    current_blockdescriptor,a1
  418.     cmp.l    (a1)+,d6
  419.     bne    @f
  420.     cmp.l    (a1)+,d7
  421.     beq    98f            ;現在のブロックデスクリプタと同じなので変更しない
  422. @@:    move.l    d7,-(sp)        ;$00 Reserved
  423.                     ;$00,$08,$00 ブロック長
  424.     move.l    d6,-(sp)        ;$00 デンシティコード
  425.                     ;$00,$00,$00 ブロック数
  426.     move.l    #$00_00_00_08,-(sp)    ;$00 モードパラメータ長(Sense時のみ)
  427.                     ;$00 メディアタイプ
  428.                     ;$00 デバイス固有パラメータ
  429.                     ;$08 ブロックデスクリプタ長
  430.     movea.l    sp,a1
  431.     moveq.l    #12,d3
  432.     bsr    modeselect
  433.     lea.l    (12,sp),sp
  434.     bmi    90f
  435.     lea.l    current_blockdescriptor,a0
  436.     move.l    d6,(a0)+
  437.     move.l    d7,(a0)+
  438. 98:    moveq.l    #0,d0
  439. 99:    movem.l    (sp)+,d1-d7/a0-a6
  440.     rts
  441.  
  442. 90:    bsr    print_scsicmd_error
  443. 91:    bsr    print_scsi_error_message_header
  444.     lea.l    (m_blocksize_change_failed,pc),a0
  445.     bsr    eprintcrlf
  446.     moveq.l    #-1,d0
  447.     bra    99b
  448.  
  449. m_blocksize_change_failed:
  450.     .dc.b    ' のブロックサイズの変更に失敗しました',0
  451.  
  452. ;----------------------------------------------------------------
  453. ;CD-ROMドライブのリードエラーリカバリパラメータを変更する
  454.     .text
  455.     .align    4,$2048
  456. change_readrecovery::
  457.     movem.l    d1-d7/a0-a6,-(sp)
  458.     tst.b    readrecovery_changed
  459.     bne    98f            ;変更済み
  460.     tst.b    blocksize_readrecovery_saved
  461.     beq    98f            ;保存されていないので変更しない
  462.     clr.l    -(sp)            ;$00,$00,$00,$00 Reserved
  463.     move.l    #$01_06_11_00,-(sp)    ;$01 ページコード($01=リードエラーリカバリパラメータ)
  464.                     ;$06 ページ長
  465.                     ;$11 リードエラーリカバリパラメータ
  466.                     ;    ($11=エラー無視,訂正はCIRCのみ)
  467.                     ;$00 リードリトライ回数
  468.     lea.l    current_blockdescriptor+8,a1
  469.     move.l    -(a1),-(sp)        ;$00 Reserved
  470.                     ;$00,$08,$00 ブロック長
  471.     move.l    -(a1),-(sp)        ;$00 デンシティコード
  472.                     ;$00,$00,$00 ブロック数
  473.     move.l    #$00_00_00_08,-(sp)    ;$00 モードパラメータ長(Sense時のみ)
  474.                     ;$00 メディアタイプ
  475.                     ;$00 デバイス固有パラメータ
  476.                     ;$08 ブロックデスクリプタ長
  477.     movea.l    sp,a1
  478.     moveq.l    #20,d3
  479.     bsr    modeselect        ;エラーは無視
  480.     lea.l    (20,sp),sp
  481.     spl.b    readrecovery_changed    ;-1=変更された
  482.     bpl    98f
  483.     bsr    print_scsicmd_error
  484.     bsr    print_scsi_error_message_header
  485.     lea.l    (m_readrecovery_change_failed,pc),a0
  486.     bsr    eprintcrlf
  487.     bsr    display_inquiry
  488. 98:    moveq.l    #0,d0
  489. 99:    movem.l    (sp)+,d1-d7/a0-a6
  490.     rts
  491.  
  492. m_readrecovery_change_failed:
  493.     .dc.b    ' のリードエラーリカバリパラメータの変更に失敗しました',0
  494.  
  495.     .data
  496. readrecovery_changed:
  497.     .dc.b    0    ;-1=リードエラーリカバリパラメータが変更された
  498.  
  499. ;----------------------------------------------------------------
  500. ;CD-ROMドライブのブロックサイズを復元する
  501.     .text
  502.     .align    4,$2048
  503. restore_blocksize::
  504.     movem.l    d1-d7/a0-a6,-(sp)
  505.     tst.b    blocksize_readrecovery_saved
  506.     beq    98f            ;保存されていないので復元できない
  507.     lea.l    blocksize_readrecovery_buffer+12,a1
  508.     move.l    -(a1),-(sp)        ;$00 Reserved
  509.                     ;$00,$08,$00 ブロック長
  510.     move.l    -(a1),-(sp)        ;$00 デンシティコード
  511.                     ;$00,$00,$00 ブロック数
  512.     move.l    #$00_00_00_08,-(sp)    ;$00 モードパラメータ長(Sense時のみ)
  513.                     ;$00 メディアタイプ
  514.                     ;$00 デバイス固有パラメータ
  515.                     ;$08 ブロックデスクリプタ長
  516.     movea.l    sp,a1
  517.     moveq.l    #12,d3
  518.     bsr    modeselect
  519.     lea.l    (12,sp),sp
  520.     bmi    90f
  521.     lea.l    current_blockdescriptor,a0
  522.     lea.l    blocksize_readrecovery_buffer+4,a1
  523.     move.l    (a1)+,(a0)+
  524.     move.l    (a1)+,(a0)+
  525. 98:    moveq.l    #0,d0
  526. 99:    movem.l    (sp)+,d1-d7/a0-a6
  527.     rts
  528.  
  529. 90:    bsr    print_scsicmd_error
  530.     bsr    print_scsi_error_message_header
  531.     lea.l    (m_blocksize_restore_failed,pc),a0
  532.     bsr    eprintcrlf
  533.     moveq.l    #-1,d0
  534.     bra    99b
  535.  
  536. m_blocksize_restore_failed:
  537.     .dc.b    ' のブロックサイズの復元に失敗しました',0
  538.  
  539. ;----------------------------------------------------------------
  540. ;CD-ROMドライブのリードエラーリカバリパラメータを復元する
  541.     .text
  542.     .align    4,$2048
  543. restore_readrecovery::
  544.     movem.l    d1-d7/a0-a6,-(sp)
  545.     tst.b    blocksize_readrecovery_saved
  546.     beq    98f            ;保存されていないので復元できない
  547.     lea.l    blocksize_readrecovery_buffer+20,a1
  548.     move.l    -(a1),-(sp)        ;$00,$00,$00,$00 Reserved
  549.     move.l    -(a1),-(sp)        ;$01 ページコード($01=リードエラーリカバリパラメータ)
  550.                     ;$06 ページ長
  551.                     ;$11 リードエラーリカバリパラメータ
  552.                     ;    ($11=エラー無視,訂正はCIRCのみ)
  553.                     ;$00 リードリトライ回数
  554.     lea.l    current_blockdescriptor+8,a1
  555.     move.l    -(a1),-(sp)        ;$00 Reserved
  556.                     ;$00,$08,$00 ブロック長
  557.     move.l    -(a1),-(sp)        ;$00 デンシティコード
  558.                     ;$00,$00,$00 ブロック数
  559.     move.l    #$00_00_00_08,-(sp)    ;$00 モードパラメータ長(Sense時のみ)
  560.                     ;$00 メディアタイプ
  561.                     ;$00 デバイス固有パラメータ
  562.                     ;$08 ブロックデスクリプタ長
  563.     movea.l    sp,a1
  564.     moveq.l    #20,d3
  565.     bsr    modeselect
  566.     lea.l    (20,sp),sp
  567.     bmi    90f
  568. 98:    moveq.l    #0,d0
  569. 99:    movem.l    (sp)+,d1-d7/a0-a6
  570.     rts
  571.  
  572. 90:    bsr    print_scsicmd_error
  573.     bsr    print_scsi_error_message_header
  574.     lea.l    (m_readrecovery_restore_failed,pc),a0
  575.     bsr    eprintcrlf
  576.     moveq.l    #-1,d0
  577.     bra    99b
  578.  
  579. m_readrecovery_restore_failed:
  580.     .dc.b    ' のリードエラーリカバリパラメータの復元に失敗しました',0
  581.  
  582. ;----------------------------------------------------------------
  583. ;CD-ROMドライブの転送速度を保存する
  584.     .text
  585.     .align    4,$2048
  586. save_cdromspeed::
  587.     movem.l    d1-d7/a0-a6,-(sp)
  588.     tst.b    cdromspeed_saved
  589.     bne    98f            ;保存済み
  590.     tst.w    cdrom_speed
  591.     bpl    @f    ;転送速度の指定があるのでドライブの種類に関わらず保存を試みる
  592.     tst.b    speed_controlable_flag
  593.     beq    98f            ;転送速度を設定できないドライブ
  594. @@:    moveq.l    #$31,d2            ;ページコード
  595.     moveq.l    #16,d3            ;アロケーション長
  596.     move.l    scsiid,d4
  597.     lea.l    cdromspeed_buffer,a1
  598.     SCSI    _S_MODESENSE
  599.     move.l    d0,d1
  600.     bsr    scsistssns
  601.     bne    90f            ;保存できない
  602.     lea.l    cdromspeed_buffer,a1
  603.     cmpi.b    #$08,(3,a1)
  604.     bne    90f            ;ブロックデスクリプタがない
  605.                     ;(_S_MODESENSEの仕様が違う)
  606.     cmpi.b    #$31,(12,a1)
  607.     bne    90f            ;ページコードが違う
  608.     cmpi.b    #$02,(13,a1)
  609.     bne    90f            ;ページの長さが違う
  610.     st.b    cdromspeed_saved
  611. 98:    moveq.l    #0,d0
  612. 99:    movem.l    (sp)+,d1-d7/a0-a6
  613.     rts
  614.  
  615. 90:    sf.b    cdromspeed_saved
  616.     tst.l    d0            ;1=エラー(リトライ可),-1=エラー(リトライ不可)
  617.     smi.b    d0
  618.     subq.b    #1,d0            ;-1=エラー(リトライ可),-2=エラー(リトライ不可)
  619.     move.b    d0,scsicmd_error_call
  620.     bsr    print_scsicmd_error
  621.     bsr    print_scsi_error_message_header
  622.     lea.l    (m_cdromspeed_save_failed,pc),a0
  623.     bsr    eprintcrlf
  624.     bsr    display_inquiry
  625.     moveq.l    #-1,d0
  626.     bra    99b
  627.  
  628. m_cdromspeed_save_failed:
  629.     .dc.b    ' の転送速度の取得に失敗しました',0
  630.  
  631.     .data
  632. cdromspeed_saved:
  633.     .dc.b    0    ;-1=転送速度が保存された
  634.  
  635.     .bss
  636.     .even
  637. cdromspeed_buffer:
  638. ;モードパラメータヘッダ
  639. ;+0
  640.     .ds.b    1    ;$00 モードパラメータ長(Sense時のみ)
  641.     .ds.b    1    ;$00 メディアタイプ
  642.     .ds.b    1    ;$00 デバイス固有パラメータ
  643.     .ds.b    1    ;$08 ブロックデスクリプタ長
  644. ;ブロックデスクリプタ
  645. ;+4
  646.     .ds.b    1    ;$00 デンシティコード
  647.     .ds.b    3    ;$00,$00,$00 ブロック数
  648.     .ds.b    1    ;$00 Reserved
  649.     .ds.b    3    ;$00,$08,$00 ブロック長
  650. ;モードパラメータページ
  651. ;+12
  652.     .ds.b    1    ;$31 ページコード($31=転送速度設定)
  653.     .ds.b    1    ;$02 ページ長
  654.     .ds.b    1    ;$FF 転送速度($FF=最高速)
  655.     .ds.b    1    ;$00 Reserved
  656. ;+16
  657.     .ds.b    16    ;予備
  658.  
  659. ;----------------------------------------------------------------
  660. ;CD-ROMドライブの転送速度を変更する
  661.     .text
  662.     .align    4,$2048
  663. change_cdromspeed::
  664.     movem.l    d1-d7/a0-a6,-(sp)
  665.     tst.b    cdromspeed_changed
  666.     bne    98f            ;変更済み
  667.     tst.b    cdromspeed_saved
  668.     beq    98f            ;保存されていないので変更しない
  669.     tst.w    cdrom_speed
  670.     bpl    @f    ;転送速度の指定があるのでドライブの種類に関わらず変更を試みる
  671.     tst.b    speed_controlable_flag
  672.     beq    98f            ;転送速度を設定できないドライブ
  673. @@:    move.l    #$31_02_FF_00,-(sp)    ;$31 ページコード($31=転送速度設定)
  674.                     ;$02 ページ長
  675.     move.b    cdrom_speed+1,(2,sp)    ;$FF 転送速度($FF=最高速)
  676.                     ;$00 Reserved
  677.     lea.l    current_blockdescriptor+8,a1
  678.     move.l    -(a1),-(sp)        ;$00 Reserved
  679.                     ;$00,$08,$00 ブロック長
  680.     move.l    -(a1),-(sp)        ;$00 デンシティコード
  681.                     ;$00,$00,$00 ブロック数
  682.     move.l    #$00_00_00_08,-(sp)    ;$00 モードパラメータ長(Sense時のみ)
  683.                     ;$00 メディアタイプ
  684.                     ;$00 デバイス固有パラメータ
  685.                     ;$08 ブロックデスクリプタ長
  686.     movea.l    sp,a1
  687.     moveq.l    #16,d3
  688.     bsr    modeselect        ;エラーは無視
  689.     lea.l    (16,sp),sp
  690.     bmi    90f
  691.     st.b    cdromspeed_changed
  692. 98:    moveq.l    #0,d0
  693. 99:    movem.l    (sp)+,d1-d7/a0-a6
  694.     rts
  695.  
  696. 90:    sf.b    cdromspeed_changed
  697.     bsr    print_scsicmd_error
  698.     bsr    print_scsi_error_message_header
  699.     lea.l    (m_cdromspeed_change_failed,pc),a0
  700.     bsr    eprintcrlf
  701.     bsr    display_inquiry
  702.     moveq.l    #-1,d0
  703.     bra    99b
  704.  
  705. m_cdromspeed_change_failed:
  706.     .dc.b    ' の転送速度の変更に失敗しました',0
  707.  
  708.     .data
  709. cdromspeed_changed:
  710.     .dc.b    0    ;-1=転送速度が変更された
  711.  
  712. ;----------------------------------------------------------------
  713. ;CD-ROMドライブの転送速度を復元する
  714.     .text
  715.     .align    4,$2048
  716. restore_cdromspeed::
  717.     movem.l    d1-d7/a0-a6,-(sp)
  718.     tst.b    cdromspeed_saved
  719.     beq    98f            ;保存されていないので復元できない
  720.     lea.l    cdromspeed_buffer+16,a1
  721.     move.l    -(a1),-(sp)        ;$31 ページコード($31=転送速度設定)
  722.                     ;$02 ページ長
  723.                     ;$FF 転送速度($FF=最高速)
  724.                     ;$00 Reserved
  725.     move.l    -(a1),-(sp)        ;$00 Reserved
  726.                     ;$00,$08,$00 ブロック長
  727.     move.l    -(a1),-(sp)        ;$00 デンシティコード
  728.                     ;$00,$00,$00 ブロック数
  729.     move.l    #$00_00_00_08,-(sp)    ;$00 モードパラメータ長(Sense時のみ)
  730.                     ;$00 メディアタイプ
  731.                     ;$00 デバイス固有パラメータ
  732.                     ;$08 ブロックデスクリプタ長
  733.     movea.l    sp,a1
  734.     moveq.l    #16,d3
  735.     bsr    modeselect        ;エラーは無視
  736.     lea.l    (16,sp),sp
  737.     bmi    90f
  738. 98:    moveq.l    #0,d0
  739. 99:    movem.l    (sp)+,d1-d7/a0-a6
  740.     rts
  741.  
  742. 90:    bsr    print_scsicmd_error
  743.     bsr    print_scsi_error_message_header
  744.     lea.l    (m_cdromspeed_restore_failed,pc),a0
  745.     bsr    eprintcrlf
  746.     moveq.l    #-1,d0
  747.     bra    99b
  748.  
  749. m_cdromspeed_restore_failed:
  750.     .dc.b    ' の転送速度の復元に失敗しました',0
  751.  
  752. ;----------------------------------------------------------------
  753. ;----------------------------------------------------------------
  754. ;CD-ROMのセクタをYellowBook Mode1(2048bytes/sector)で読み込む
  755. ;    (density=$00,size=$0800)
  756. ;<d0.l:絶対セクタ番号
  757. ;<d1.l:セクタ数(<=65535)
  758. ;<a0.l:バッファ(セクタ数*2048バイト)
  759. ;>d0.l:-1=エラー
  760. ;>n-flag:mi=エラー
  761.     .text
  762.     .align    4,$2048
  763. read_cdrom_mode1_2048::
  764.     movem.l    d1-d7/a0-a6,-(sp)
  765.     move.l    d0,d2
  766.     movea.l    a0,a1
  767.     lea.l    (blocksize_mode1_2048,pc),a0
  768.     bsr    change_blocksize
  769.     bmi    90f
  770.     lea.l    cmd_read,a0
  771.     move.l    d2,(2,a0)        ;絶対セクタ番号
  772.     move.w    d1,d0            ;転送セクタ数
  773.     move.b    d0,(8,a0)        ;下位
  774.     lsr.w    #8,d0
  775.     move.b    d0,(7,a0)        ;上位
  776.     mulu.w    #2048,d1
  777.     move.l    a1,-(sp)        ;バッファ
  778.     move.l    d1,-(sp)        ;転送バイト数
  779.     move.l    a0,-(sp)        ;コマンド
  780.     pea.l    12.w            ;コマンド長
  781.     bsr    scsicmd
  782.     lea.l    (16,sp),sp
  783.     bmi    90f
  784. 98:    moveq.l    #0,d0
  785. 99:    movem.l    (sp)+,d1-d7/a0-a6
  786.     rts
  787.  
  788. 90:    moveq.l    #-1,d0
  789.     bra    99b
  790.  
  791.     .even
  792. blocksize_mode1_2048:
  793.     .dc.b    $00        ;デンシティコード
  794.     .dc.b    $00,$00,$00    ;ブロック数
  795.     .dc.b    $00        ;Reserved
  796.     .dc.b    $00,$08,$00    ;ブロック長
  797.  
  798.     .data
  799.     .even
  800. cmd_read:
  801.     .dc.b    $28        ;オペレーションコード($28=Read)
  802.     .dc.b    $00        ;LUN
  803.     .dc.b    $00,$00,$00,$00    ;開始フレーム番号
  804.     .dc.b    $00
  805.     .dc.b    $00,$01        ;転送フレーム数
  806.     .dc.b    $00,$00,$00
  807.  
  808. ;----------------------------------------------------------------
  809. ;CD-ROMのセクタをCD-XA Mode2 form1(2048bytes/sector)で読み込む
  810. ;    (density=$81,size=$0800)
  811. ;<d0.l:絶対セクタ番号
  812. ;<d1.l:セクタ数(<=65535)
  813. ;<a0.l:バッファ(セクタ数*2048バイト)
  814. ;>d0.l:-1=エラー
  815. ;>n-flag:mi=エラー
  816.     .text
  817.     .align    4,$2048
  818. read_cdrom_mode2_2048::
  819.     movem.l    d1-d7/a0-a6,-(sp)
  820.     move.l    d0,d2
  821.     movea.l    a0,a1
  822.     lea.l    (blocksize_mode2_2048_sony,pc),a0
  823.     tst.b    cdrom_type
  824.     ble    @f
  825.     lea.l    (blocksize_mode2_2048_toshiba,pc),a0
  826. @@:    bsr    change_blocksize
  827.     bmi    90f
  828.     lea.l    cmd_read,a0
  829.     move.l    d2,(2,a0)        ;絶対セクタ番号
  830.     move.w    d1,d0            ;転送セクタ数
  831.     move.b    d0,(8,a0)        ;下位
  832.     lsr.w    #8,d0
  833.     move.b    d0,(7,a0)        ;上位
  834.     mulu.w    #2048,d1
  835.     move.l    a1,-(sp)        ;バッファ
  836.     move.l    d1,-(sp)        ;転送バイト数
  837.     move.l    a0,-(sp)        ;コマンド
  838.     pea.l    12.w            ;コマンド長
  839.     bsr    scsicmd
  840.     lea.l    (16,sp),sp
  841.     bmi    90f
  842. 98:    moveq.l    #0,d0
  843. 99:    movem.l    (sp)+,d1-d7/a0-a6
  844.     rts
  845.  
  846. 90:    moveq.l    #-1,d0
  847.     bra    99b
  848.  
  849.     .even
  850. blocksize_mode2_2048_sony:
  851.     .dc.b    $00        ;デンシティコード
  852.     .dc.b    $00,$00,$00    ;ブロック数
  853.     .dc.b    $00        ;Reserved
  854.     .dc.b    $00,$08,$00    ;ブロック長
  855.  
  856.     .even
  857. blocksize_mode2_2048_toshiba:
  858.     .dc.b    $81        ;デンシティコード
  859.     .dc.b    $00,$00,$00    ;ブロック数
  860.     .dc.b    $00        ;Reserved
  861.     .dc.b    $00,$08,$00    ;ブロック長
  862.  
  863.   .if 0
  864.     .data
  865.     .even
  866. cmd_read:
  867.     .dc.b    $28        ;オペレーションコード($28=Read)
  868.     .dc.b    $00        ;LUN
  869.     .dc.b    $00,$00,$00,$00    ;開始フレーム番号
  870.     .dc.b    $00
  871.     .dc.b    $00,$01        ;転送フレーム数
  872.     .dc.b    $00,$00,$00
  873.   .endif
  874.  
  875. ;----------------------------------------------------------------
  876. ;CD-ROMのセクタをCD-XA Mode2 form2(2324bytes/sector)で読み込む
  877. ;    (density=$81,size=$0914)
  878. ;<d0.l:絶対セクタ番号
  879. ;<d1.l:セクタ数(<=65535)
  880. ;<a0.l:バッファ(セクタ数*2324バイト)
  881. ;>d0.l:-1=エラー
  882. ;>n-flag:mi=エラー
  883.     .text
  884.     .align    4,$2048
  885. read_cdrom_mode2_2324::
  886.     movem.l    d1-d7/a0-a6,-(sp)
  887.     move.l    d0,d2
  888.     movea.l    a0,a1
  889.     lea.l    (blocksize_mode2_2324_sony,pc),a0
  890.     tst.b    cdrom_type
  891.     ble    @f
  892.     lea.l    (blocksize_mode2_2324_toshiba,pc),a0
  893. @@:    bsr    change_blocksize
  894.     bmi    90f
  895.     lea.l    cmd_read,a0
  896.     move.l    d2,(2,a0)        ;絶対セクタ番号
  897.     move.w    d1,d0            ;転送セクタ数
  898.     move.b    d0,(8,a0)        ;下位
  899.     lsr.w    #8,d0
  900.     move.b    d0,(7,a0)        ;上位
  901.     mulu.w    #2324,d1
  902.     move.l    a1,-(sp)        ;バッファ
  903.     move.l    d1,-(sp)        ;転送バイト数
  904.     move.l    a0,-(sp)        ;コマンド
  905.     pea.l    12.w            ;コマンド長
  906.     bsr    scsicmd
  907.     lea.l    (16,sp),sp
  908.     bmi    90f
  909. 98:    moveq.l    #0,d0
  910. 99:    movem.l    (sp)+,d1-d7/a0-a6
  911.     rts
  912.  
  913. 90:    moveq.l    #-1,d0
  914.     bra    99b
  915.  
  916.     .even
  917. blocksize_mode2_2324_sony:
  918.     .dc.b    $00        ;デンシティコード
  919.     .dc.b    $00,$00,$00    ;ブロック数
  920.     .dc.b    $00        ;Reserved
  921.     .dc.b    $00,$09,$14    ;ブロック長
  922.  
  923.     .even
  924. blocksize_mode2_2324_toshiba:
  925.     .dc.b    $81        ;デンシティコード
  926.     .dc.b    $00,$00,$00    ;ブロック数
  927.     .dc.b    $00        ;Reserved
  928.     .dc.b    $00,$09,$14    ;ブロック長
  929.  
  930.   .if 0
  931.     .data
  932.     .even
  933. cmd_read:
  934.     .dc.b    $28        ;オペレーションコード($28=Read)
  935.     .dc.b    $00        ;LUN
  936.     .dc.b    $00,$00,$00,$00    ;開始フレーム番号
  937.     .dc.b    $00
  938.     .dc.b    $00,$01        ;転送フレーム数
  939.     .dc.b    $00,$00,$00
  940.   .endif
  941.  
  942. ;----------------------------------------------------------------
  943. ;CD-ROMのセクタをYellowBook Mode2(2336bytes/sector)で読み込む
  944. ;    (density=$81,size=$0920)
  945. ;<d0.l:絶対セクタ番号
  946. ;<d1.l:セクタ数(<=65535)
  947. ;<a0.l:バッファ(セクタ数*2336バイト)
  948. ;>d0.l:-1=エラー
  949. ;>n-flag:mi=エラー
  950.     .text
  951.     .align    4,$2048
  952. read_cdrom_mode2_2336::
  953.     movem.l    d1-d7/a0-a6,-(sp)
  954.     move.l    d0,d2
  955.     movea.l    a0,a1
  956.     lea.l    (blocksize_mode2_2336_sony,pc),a0
  957.     tst.b    cdrom_type
  958.     ble    @f
  959.     lea.l    (blocksize_mode2_2336_toshiba,pc),a0
  960. @@:    bsr    change_blocksize
  961.     bmi    90f
  962.     lea.l    cmd_read,a0
  963.     move.l    d2,(2,a0)        ;絶対セクタ番号
  964.     move.w    d1,d0            ;転送セクタ数
  965.     move.b    d0,(8,a0)        ;下位
  966.     lsr.w    #8,d0
  967.     move.b    d0,(7,a0)        ;上位
  968.     mulu.w    #2336,d1
  969.     move.l    a1,-(sp)        ;バッファ
  970.     move.l    d1,-(sp)        ;転送バイト数
  971.     move.l    a0,-(sp)        ;コマンド
  972.     pea.l    12.w            ;コマンド長
  973.     bsr    scsicmd
  974.     lea.l    (16,sp),sp
  975.     bmi    90f
  976. 98:    moveq.l    #0,d0
  977. 99:    movem.l    (sp)+,d1-d7/a0-a6
  978.     rts
  979.  
  980. 90:    moveq.l    #-1,d0
  981.     bra    99b
  982.  
  983.     .even
  984. blocksize_mode2_2336_sony:
  985.     .dc.b    $00        ;デンシティコード
  986.     .dc.b    $00,$00,$00    ;ブロック数
  987.     .dc.b    $00        ;Reserved
  988.     .dc.b    $00,$09,$20    ;ブロック長
  989.  
  990.     .even
  991. blocksize_mode2_2336_toshiba:
  992.     .dc.b    $81        ;デンシティコード
  993.     .dc.b    $00,$00,$00    ;ブロック数
  994.     .dc.b    $00        ;Reserved
  995.     .dc.b    $00,$09,$20    ;ブロック長
  996.  
  997.   .if 0
  998.     .data
  999.     .even
  1000. cmd_read:
  1001.     .dc.b    $28        ;オペレーションコード($28=Read)
  1002.     .dc.b    $00        ;LUN
  1003.     .dc.b    $00,$00,$00,$00    ;開始フレーム番号
  1004.     .dc.b    $00
  1005.     .dc.b    $00,$01        ;転送フレーム数
  1006.     .dc.b    $00,$00,$00
  1007.   .endif
  1008.  
  1009. ;----------------------------------------------------------------
  1010. ;CD-ROMのセクタをMode2(2352bytes/sector)で読み込む
  1011. ;    (density=$81,size=$0930)
  1012. ;<d0.l:絶対セクタ番号
  1013. ;<d1.l:セクタ数(<=65535)
  1014. ;<a0.l:バッファ(セクタ数*2352バイト)
  1015. ;>d0.l:-1=エラー
  1016. ;>n-flag:mi=エラー
  1017.     .text
  1018.     .align    4,$2048
  1019. read_cdrom_mode2_2352::
  1020.     movem.l    d1-d7/a0-a6,-(sp)
  1021.     move.l    d0,d2
  1022.     movea.l    a0,a1
  1023.     lea.l    (blocksize_mode2_2352_sony,pc),a0
  1024.     tst.b    cdrom_type
  1025.     ble    @f
  1026.     lea.l    (blocksize_mode2_2352_toshiba,pc),a0
  1027. @@:    bsr    change_blocksize
  1028.     bmi    90f
  1029.     lea.l    cmd_read,a0
  1030.     move.l    d2,(2,a0)        ;絶対セクタ番号
  1031.     move.w    d1,d0            ;転送セクタ数
  1032.     move.b    d0,(8,a0)        ;下位
  1033.     lsr.w    #8,d0
  1034.     move.b    d0,(7,a0)        ;上位
  1035.     mulu.w    #2352,d1
  1036.     move.l    a1,-(sp)        ;バッファ
  1037.     move.l    d1,-(sp)        ;転送バイト数
  1038.     move.l    a0,-(sp)        ;コマンド
  1039.     pea.l    12.w            ;コマンド長
  1040.     bsr    scsicmd
  1041.     lea.l    (16,sp),sp
  1042.     bmi    90f
  1043. 98:    moveq.l    #0,d0
  1044. 99:    movem.l    (sp)+,d1-d7/a0-a6
  1045.     rts
  1046.  
  1047. 90:    moveq.l    #-1,d0
  1048.     bra    99b
  1049.  
  1050.     .even
  1051. blocksize_mode2_2352_sony:
  1052.     .dc.b    $00        ;デンシティコード
  1053.     .dc.b    $00,$00,$00    ;ブロック数
  1054.     .dc.b    $00        ;Reserved
  1055.     .dc.b    $00,$09,$30    ;ブロック長
  1056.  
  1057.     .even
  1058. blocksize_mode2_2352_toshiba:
  1059.     .dc.b    $81        ;デンシティコード
  1060.     .dc.b    $00,$00,$00    ;ブロック数
  1061.     .dc.b    $00        ;Reserved
  1062.     .dc.b    $00,$09,$30    ;ブロック長
  1063.  
  1064.   .if 0
  1065.     .data
  1066.     .even
  1067. cmd_read:
  1068.     .dc.b    $28        ;オペレーションコード($28=Read)
  1069.     .dc.b    $00        ;LUN
  1070.     .dc.b    $00,$00,$00,$00    ;開始フレーム番号
  1071.     .dc.b    $00
  1072.     .dc.b    $00,$01        ;転送フレーム数
  1073.     .dc.b    $00,$00,$00
  1074.   .endif
  1075.  
  1076. ;----------------------------------------------------------------
  1077. ;CD-ROMのセクタをRedBook(2352bytes/sector)で読み込む
  1078. ;    (density=$82,size=$0930)
  1079. ;<d0.l:絶対セクタ番号
  1080. ;<d1.l:セクタ数(<=65535)
  1081. ;<a0.l:バッファ(セクタ数*2352バイト)
  1082. ;>d0.l:-1=エラー
  1083. ;>n-flag:mi=エラー
  1084.     .text
  1085.     .align    4,$2048
  1086. read_cdrom_audio_2352::
  1087.     movem.l    d1-d7/a0-a6,-(sp)
  1088.     move.l    d0,d2
  1089.     movea.l    a0,a1
  1090.     lea.l    (blocksize_audio_2352_sony,pc),a0
  1091.     tst.b    cdrom_type
  1092.     ble    @f
  1093.     lea.l    (blocksize_audio_2352_toshiba,pc),a0
  1094. @@:    bsr    change_blocksize
  1095.     bmi    90f
  1096.     tst.b    cdrom_type
  1097.     bgt    1f
  1098.     lea.l    cmd_readcdda_sony,a0
  1099.     move.l    d2,(2,a0)        ;絶対セクタ番号
  1100.     move.w    d1,(8,a0)        ;転送セクタ数
  1101.     bra    2f
  1102. 1:    lea.l    cmd_read,a0
  1103.     move.l    d2,(2,a0)        ;絶対セクタ番号
  1104.     move.w    d1,d0            ;転送セクタ数
  1105.     move.b    d0,(8,a0)        ;下位
  1106.     lsr.w    #8,d0
  1107.     move.b    d0,(7,a0)        ;上位
  1108. 2:    mulu.w    #2352,d1
  1109.     move.l    a1,-(sp)        ;バッファ
  1110.     move.l    d1,-(sp)        ;転送バイト数
  1111.     move.l    a0,-(sp)        ;コマンド
  1112.     pea.l    12.w            ;コマンド長
  1113.     bsr    scsicmd
  1114.     lea.l    (16,sp),sp
  1115.     bmi    90f
  1116. 98:    moveq.l    #0,d0
  1117. 99:    movem.l    (sp)+,d1-d7/a0-a6
  1118.     rts
  1119.  
  1120. 90:    moveq.l    #-1,d0
  1121.     bra    99b
  1122.  
  1123.     .even
  1124. blocksize_audio_2352_sony:
  1125.     .dc.b    $00        ;デンシティコード
  1126.     .dc.b    $00,$00,$00    ;ブロック数
  1127.     .dc.b    $00        ;Reserved
  1128.     .dc.b    $00,$09,$30    ;ブロック長
  1129.  
  1130.     .even
  1131. blocksize_audio_2352_toshiba:
  1132.     .dc.b    $82        ;デンシティコード
  1133.     .dc.b    $00,$00,$00    ;ブロック数
  1134.     .dc.b    $00        ;Reserved
  1135.     .dc.b    $00,$09,$30    ;ブロック長
  1136.  
  1137.   .if 0
  1138.     .data
  1139.     .even
  1140. cmd_read:
  1141.     .dc.b    $28        ;オペレーションコード($28=Read)
  1142.     .dc.b    $00        ;LUN
  1143.     .dc.b    $00,$00,$00,$00    ;開始フレーム番号
  1144.     .dc.b    $00
  1145.     .dc.b    $00,$01        ;転送フレーム数
  1146.     .dc.b    $00,$00,$00
  1147.   .endif
  1148.  
  1149.     .data
  1150.     .even
  1151. cmd_readcdda_sony:
  1152.     .dc.b    $D8        ;オペレーションコード($D8=ReadCDDA)
  1153.     .dc.b    $00        ;LUN
  1154.     .dc.b    $00,$00,$00,$00    ;開始フレーム番号
  1155.     .dc.b    $00,$00
  1156.     .dc.b    $00,$01        ;転送フレーム数
  1157.     .dc.b    $00,$00
  1158.  
  1159. ;----------------------------------------------------------------
  1160. ;----------------------------------------------------------------
  1161. ;Inquiryを表示する
  1162. ;    inquiryを取得した後に実行すること
  1163.     .text
  1164.     .align    4,$2048
  1165. display_inquiry::
  1166.     movem.l    d0-d1/a0-a1,-(sp)
  1167.     tst.b    display_inquiry_done
  1168.     bne    9f
  1169.     st.b    display_inquiry_done
  1170.     lea.l    (m_inq_1,pc),a0
  1171.     bsr    eprint
  1172.     lea.l    inq_error_tmp,a0
  1173.     lea.l    inquiry_buffer+SCSINQ_ADDBUF+3,a1
  1174.     moveq.l    #24-1,d1
  1175. 1:    move.b    (a1)+,d0
  1176.     bsr    encode_esc
  1177.     dbra    d1,1b
  1178.     sf.b    (a0)
  1179.     lea.l    inq_error_tmp,a0
  1180.     bsr    eprint
  1181.     lea.l    (m_inq_2,pc),a0
  1182.     bsr    eprintcrlf
  1183. 9:    movem.l    (sp)+,d0-d1/a0-a1
  1184.     rts
  1185.  
  1186. m_inq_1:        .dc.b    'Inquiry: [',0
  1187. m_inq_2:        .dc.b    ']',0
  1188.     .even
  1189.  
  1190.     .data
  1191. display_inquiry_done:    .dc.b    0    ;-1=inquiryを表示した
  1192.  
  1193.     .bss
  1194.     .even
  1195. inq_error_tmp:        .ds.b    256
  1196.  
  1197. ;----------------------------------------------------------------
  1198. ;----------------------------------------------------------------
  1199. ;CDのトラック情報を取得する
  1200. ;>d0.l:0=正常終了,-1=エラー
  1201.     .text
  1202.     .align    4,$2048
  1203. get_track_info::
  1204.     movem.l    d1-d7/a0-a6,-(sp)
  1205.  
  1206.     move.l    scsiid,d0
  1207.     cmp.l    trkinf_scsiid,d0
  1208.     beq    98f
  1209.  
  1210. ;トラック数とトータルタイムを取得する
  1211.     lea.l    cmd_work,a0
  1212.     move.l    a0,-(sp)
  1213.     pea.l    12.w
  1214.     pea.l    (cmd_readtoc_readout,pc)
  1215.     pea.l    10.w
  1216.     bsr    scsicmd
  1217.     lea.l    (16,sp),sp
  1218.     bmi    90f
  1219.     moveq.l    #0,d0
  1220.     move.b    (2,a0),d0
  1221.     beq    90f            ;念のため
  1222.     cmp.b    #99,d0
  1223.     bhi    90f            ;念のため
  1224.     move.l    d0,cdda_mintrk
  1225.     moveq.l    #0,d1
  1226.     move.b    (3,a0),d1
  1227.     beq    90f            ;念のため
  1228.     cmp.b    #99,d1
  1229.     bhi    90f            ;念のため
  1230.     cmp.b    d0,d1
  1231.     blo    90f            ;念のため
  1232.     move.l    d1,cdda_maxtrk
  1233.     move.l    (8,a0),d0
  1234.     and.l    #$00FFFFFF,d0
  1235.     beq    90f            ;念のため
  1236.     move.l    d0,cdda_maxtim
  1237.     bsr    msf2frm
  1238.     move.l    d0,cdda_maxfrm
  1239.  
  1240. ;CD名とトラック情報レコードを初期化する
  1241.     clr.b    cd_name            ;CD名
  1242.     lea.l    cdda_trkinf,a0        ;トラック情報レコード
  1243.     moveq.l    #0,d0
  1244.     move.w    #trkinf_record_size*99/16-1,d1
  1245. 1:    move.l    d0,(a0)+
  1246.     move.l    d0,(a0)+
  1247.     move.l    d0,(a0)+
  1248.     move.l    d0,(a0)+
  1249.     dbra    d1,1b
  1250.  
  1251. ;先頭のトラックのトラック情報レコードのアドレスを求める
  1252.     lea.l    cdda_trkinf,a3
  1253.     move.l    cdda_mintrk,d0        ;先頭のトラック番号が1よりも大きかった場合に対応
  1254.     subq.b    #1,d0            ;(念のため)
  1255.     mulu.w    #trkinf_record_size,d0
  1256.     lea.l    (a3,d0.l),a3        ;cdda_mintrkのトラック情報レコードの先頭
  1257.  
  1258. ;トラックの開始時間とデータトラックかどうかのフラグを設定する
  1259.     movea.l    a3,a2
  1260.     move.l    cdda_mintrk,d6        ;トラック番号
  1261. 10:    lea.l    cmd_work,a0
  1262.     lea.l    cmd_readtoc,a1
  1263.     move.b    d6,(6,a1)
  1264.     move.l    a0,-(sp)
  1265.     pea.l    12.w
  1266.     move.l    a1,-(sp)
  1267.     pea.l    10.w
  1268.     bsr    scsicmd
  1269.     lea.l    (16,sp),sp
  1270.     bmi    90f
  1271.     btst.b    #2,(5,a0)
  1272.     sne.b    (trkinf_dattrk,a2)    ;-1=データトラック
  1273.     move.l    (8,a0),d0
  1274.     and.l    #$00FFFFFF,d0        ;開始位置(MSF)
  1275.     move.l    d0,(trkinf_toptim,a2)
  1276.     bsr    msf2frm
  1277.     move.l    d0,(trkinf_topfrm,a2)
  1278.     lea.l    (trkinf_record_size,a2),a2
  1279.     addq.b    #1,d6
  1280.     cmp.l    cdda_maxtrk,d6
  1281.     bls    10b
  1282.  
  1283. ;トラックの終了時間と長さを設定する
  1284.     movea.l    a3,a2
  1285.     move.l    cdda_mintrk,d6        ;トラック番号
  1286. 10:    cmp.l    cdda_maxtrk,d6
  1287.     beq    1f
  1288.     move.l    (trkinf_record_size+trkinf_topfrm,a2),d1
  1289.     bra    2f
  1290. 1:    move.l    cdda_maxfrm,d1
  1291. 2:    move.l    d1,d0
  1292.     subq.l    #1,d0
  1293.     move.l    d0,(trkinf_btmfrm,a2)
  1294.     bsr    frm2msf
  1295.     move.l    d0,(trkinf_btmtim,a2)
  1296.     move.l    d1,d0
  1297.     sub.l    (trkinf_topfrm,a2),d0    ;フレーム数
  1298.     ble    90f            ;念のため
  1299.     move.l    d0,(trkinf_lenfrm,a2)
  1300.     sub.l    #75*2,d0        ;frm2msfが2秒増やしてしまうので調整しておく
  1301.     bsr    frm2msf
  1302.     move.l    d0,(trkinf_lentim,a2)
  1303.     lea.l    (trkinf_record_size,a2),a2
  1304.     addq.b    #1,d6
  1305.     cmp.l    cdda_maxtrk,d6
  1306.     bls    10b
  1307.  
  1308.     bsr    super            ;スーパーバイザモードに移行
  1309.  
  1310. ;現在のCDがCDCLISTにあるか
  1311.     _CDC_CHK_S
  1312.     beq    29f
  1313.     CDC    _CDC_TRACKS
  1314.     movea.l    d0,a4            ;CDCの曲名リストワークアドレス
  1315.     tst.l    (14,a4)            ;現在のCDがCDCLISTにあるか
  1316.     beq    29f            ;CDCLISTにない
  1317.  
  1318. ;CD名を取得する
  1319.     lea.l    cd_name,a0
  1320.     lea.l    (18,a4),a1        ;CD名
  1321.     moveq.l    #36-1,d0
  1322.     bsr    strncpy_name
  1323.  
  1324. ;トラック名を設定する
  1325.     movea.l    a3,a2
  1326.     move.l    cdda_mintrk,d6        ;トラック番号
  1327. 10:    lea.l    (trkinf_name,a2),a0
  1328.   .if 0
  1329.     lea.l    (str_track,pc),a1
  1330.     bsr    strcpy
  1331.     move.l    d6,d0
  1332.     bsr    utos
  1333.     move.b    #' ',(a0)+
  1334.     clr.b    (a0)
  1335.   .endif
  1336.     cmp.l    (6,a4),d6        ;CDCLISTに登録されている最大トラック番号と比較
  1337.     bhi    18f
  1338.     move.w    d6,d0            ;×1
  1339.     lsl.w    #2,d0            ;×4
  1340.     add.w    d6,d0            ;×5
  1341.     lsl.w    #3,d0            ;×40
  1342.     lea.l    (58,a4,d0.w),a1        ;曲名の先頭
  1343.     moveq.l    #36-1,d0
  1344.     bsr    strncpy_name
  1345. 18:    lea.l    (trkinf_record_size,a2),a2
  1346.     addq.b    #1,d6
  1347.     cmp.l    cdda_maxtrk,d6
  1348.     bls    10b
  1349. 19:
  1350.  
  1351. 29:    bsr    user            ;ユーザモードに復帰
  1352.  
  1353.     move.l    scsiid,trkinf_scsiid
  1354. 98:    moveq.l    #0,d0
  1355. 99:    movem.l    (sp)+,d1-d7/a0-a6
  1356.     rts
  1357.  
  1358. 90:    moveq.l    #-1,d0
  1359.     bra    99b
  1360.  
  1361. cmd_readtoc_readout:
  1362.     .dc.b    $43        ;オペレーションコード($43=ReadTOC)
  1363.     .dc.b    $02        ;LUN,MSF=1
  1364.     .dc.b    $00,$00,$00,$00    ;Reserved
  1365.     .dc.b    $AA        ;トラック番号($AA=リードアウトトラック)
  1366.     .dc.b    $00,$0C        ;アロケーション長
  1367.     .dc.b    $00        ;コントロールバイト
  1368.     .even
  1369.  
  1370.   .if 0
  1371. str_track:        .dc.b    'トラック ',0
  1372.     .even
  1373.   .endif
  1374.  
  1375.     .data
  1376.     .align    4
  1377. ;cdda_mintim:        .dc.l    2<<8    ;開始フレームは00:02:00,
  1378. ;cdda_minfrm:        .dc.l    150    ; (フレーム番号=150)に固定
  1379. cdda_maxtim:        .dc.l    0
  1380. cdda_maxfrm::        .dc.l    0    ;フレーム番号の最大値
  1381. trkinf_scsiid:        .dc.l    -1    ;トラック情報の有効なscsiid
  1382.  
  1383.     .even
  1384. cmd_readtoc::
  1385.     .dc.b    $43        ;オペレーションコード($43=ReadTOC)
  1386.     .dc.b    $02        ;LUN,MSF=1
  1387.     .dc.b    $00,$00,$00,$00    ;Reserved
  1388.     .dc.b    $00        ;トラック番号
  1389.     .dc.b    $00,$0C        ;アロケーション長
  1390.     .dc.b    $00        ;コントロールバイト
  1391.  
  1392.     .bss
  1393.     .align    4
  1394. cdda_mintrk::        .dc.l    0    ;トラック番号の最小値(1~99)
  1395. cdda_maxtrk::        .dc.l    0    ;トラック番号の最大値(1~99)
  1396. cmd_work:        .ds.b    256
  1397. cd_name::        .ds.b    64    ;CD名
  1398.     .align    4
  1399. cdda_trkinf::        .ds.b    trkinf_record_size*99    ;トラック情報レコード
  1400.                             ;トラック番号1~
  1401.  
  1402. ;----------------------------------------------------------------
  1403. ;曲名を得る
  1404. ;<d0.l:トラック番号(1~99)
  1405. ;<a0.l:曲名をコピーするバッファの先頭
  1406. ;>a0.l:曲名の末尾の0の位置
  1407. ;>d0.l:コピーした曲名の長さ(0=曲名が得られない)
  1408. ;>z-flag:eq=曲名が得られない
  1409.     .text
  1410.     .align    4,$2048
  1411. get_track_name::
  1412.     movem.l    a0-a1,-(sp)
  1413.     cmp.w    #99,d0
  1414.     bhi    9f            ;念のため
  1415.     subq.w    #1,d0
  1416.     bcs    9f            ;念のため
  1417.     mulu.w    #trkinf_record_size,d0
  1418.     lea.l    cdda_trkinf,a1
  1419.     lea.l    (trkinf_name,a1,d0.l),a1
  1420.     bsr    strcpy
  1421. 9:    clr.b    (a0)
  1422.     move.l    a0,d0
  1423.     sub.l    (sp)+,d0
  1424.     movea.l    (sp)+,a1
  1425.     rts
  1426.